/*
 * InitServlet.java
 *
 * Created on 14 de noviembre de 2006, 9:59
 */

package es.team.tareas.servlets;

import es.team.tareas.management.AplicationManager;
import es.team.tareas.bd.DataBaseManager;
import es.team.util.PropertyConfig;
import es.team.exceptions.BadConfigException;
import java.io.*;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.sql.DataSource;
//import org.apache.log4j.PropertyConfigurator;

/**
 * Servlet que inicializa el PropertyConfig, el Logger y delega la inicializacion
 * del pool de conexiones a la clase que extienda al Servlet.
 * @author Victor Gimeno
 * @version 1.0
 */
public class InitServlet extends HttpServlet {
    
    /** Key para la ruta del fichero principal de configuracion. */
    private static final String CONFIG_PATH = "config_path";
    
    private static final String KEY_PROYECTO = "proyecto";
    
    private static final String KEY_VERBOSE = "verbose";
    
    private static boolean VERBOSE = false;
    
    private static String PROYECTO = "Proyecto Undefined";
    
    /**
     * Inicializa el servlet.
     */
    public final void init() throws ServletException {
        
        try{
            
            super.init();
            InitServlet.PROYECTO = getServletConfig().getInitParameter( KEY_PROYECTO  );
            
            InitServlet.VERBOSE = "true".equalsIgnoreCase(getServletConfig().getInitParameter( KEY_VERBOSE  ));
            
            initPropertyConfig();
            
            initLog();
            
//            AplicationManager.logControlMessage( PROYECTO+": #################################### ARRANCANDO APLICACION ##", null);
//            
//            AplicationManager.logControlMessage( PROYECTO+": Propiedades del Proyecto y Ficheros de log configurados correctamente.", null);
//            
            initPools();
//                       
//            AplicationManager.logControlMessage( PROYECTO+": proyecto arrancado.", null);
//            
            if(VERBOSE)
                System.out.println(PROYECTO+": proyecto arrancado.");
            
//            AplicationManager.logControlMessage( PROYECTO+": ############################################## ARRANQUE OK ##", null);
                       
        }catch (javax.naming.NamingException nex){
            System.out.println(PROYECTO+": NamingException al iniciar el Pool");
            System.out.println(PROYECTO+": ################## ARRANQUE FALLIDO.##, abortar despliegue.##");
//            
//            AplicationManager.logControlMessage( PROYECTO+": NamingException al iniciar el Pool", nex);
//            AplicationManager.logControlMessage( PROYECTO+": ################## ARRANQUE FALLIDO.##, abortar despliegue.##", null);
//             
            if(VERBOSE){
                System.out.println(PROYECTO+": ## Error de inicializacion de la aplicacion.## ARRANQUE FALLIDO.##, abortar despliegue.");
                nex.printStackTrace();
            }
            
        }catch(Exception ex){
            System.out.println(PROYECTO+": Error de inicializacion de la aplicacion.");
                
//            AplicationManager.logControlMessage( PROYECTO+": Error de inicializacion de la aplicacion.", ex);
//            AplicationManager.logControlMessage( PROYECTO+": ################## ARRANQUE FALLIDO.##, abortar despliegue.##", null);
//            
            if(VERBOSE){
                System.out.println(PROYECTO+": ## Error de inicializacion de la aplicacion.## ARRANQUE FALLIDO.##, abortar despliegue.");
                ex.printStackTrace();
            }
            
        }
    }
    
    /**
     * Metodo para inicializar el ConfigProperties con el fichero de properties
     */
    private final void initPropertyConfig () throws IOException, BadConfigException{
        
        if(VERBOSE)
            System.out.println(PROYECTO+": configurando propiedades del proyectooooooooooooooooooooooooooooooooooooooooooooooooo.");
        
        String propPath = getServletConfig().getInitParameter( CONFIG_PATH  );

        if( propPath == null || "".equalsIgnoreCase( propPath ) ){
            
            if(VERBOSE)
                System.out.println("## Error de inicializacion de la ruta del fichero de configuracion del log. ## " );
            
            throw new BadConfigException( "El parametro inicial del servlet ["+CONFIG_PATH+"] es necesario para iniciar la aplicacion." );

        }
        
        String realPath = getServletContext().getRealPath( propPath );
        if(VERBOSE)
            System.out.println(PROYECTO+": configurando archivo con path real="+realPath);
        PropertyConfig.configure( realPath );
                
        if(VERBOSE)
            System.out.println(PROYECTO+": verificando propiedades cargadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaas.");
        
        //Comprueba las configuraciones minimas para la aplicacion.
       // AplicationManager.checkDefinitions();

    }
    
    /**
     * Metodo para inicializar el Logger con el fichero de properties
     */
    private final void initLog() throws IOException, BadConfigException{
        
        if(VERBOSE)
            System.out.println(PROYECTO+": configurando ficheros de loggggg.");
        
      //  String realPath = getServletContext().getRealPath( AplicationManager.getLogConfigPath() );
        
      //  PropertyConfigurator.configure( realPath );
                
    }
    
    /**
     * Metodo para inicializar el Pool de conexiones y el objeto Transaccion.
     */
    private final void initPools() throws NamingException, BadConfigException, Exception{
        
      //  AplicationManager.logControlMessage( PROYECTO+":  iniciando configuracion de los pools de conexiones a base de datos.", null);
        
        if(VERBOSE)
            System.out.println(PROYECTO+": iniciando configuracion de los pools de conexiones a base de datos.");
        if (true){
//        if( AplicationManager.isBbddOpen() ){ 

            InitialContext ctx = new InitialContext();
            String nombreServidor = getServletContext().getServerInfo();
            String dsName = AplicationManager.getDsName();

            DataSource ds = (DataSource)ctx.lookup( ((nombreServidor.indexOf("Tomcat") == -1)?"":"java:comp/env/") + dsName );

            DataBaseManager.setDataSource( ds, getServletContext().getRealPath( AplicationManager.getSqlFilePath() ) );

//            AplicationManager.logControlMessage( PROYECTO+":  configurado el datasource "+dsName, null);

            if(VERBOSE){
                System.out.println(PROYECTO+": configurado el datasource "+dsName);
            }

        }else{
            
//            AplicationManager.logControlMessage( PROYECTO+":  Base de datos cerrada, funcionando en modo simulado.", null);
            if(VERBOSE)
                System.out.println(PROYECTO+": Base de datos cerrada, funcionando en modo simulado.");

        }
        
//        AplicationManager.logControlMessage( PROYECTO+":  configuracion de los pools - OK.", null);
        if(VERBOSE)
            System.out.println(PROYECTO+":  configuracion de los pools - OK.");
        
    }
    

    /**
     * Destruye el servlet.
     */
    public final void destroy() {
        
        super.destroy();
        
    }
    
    // <editor-fold defaultstate="collapsed" desc="M�TODOS DEL HTTP, SOLO ENVIAN A FORBIDDEN.">
    /**
     * Procesa los metodos <code>GET</code> y <code>POST</code> de HTTP.
     * @param request servlet request
     * @param response servlet response
     * @throws javax.servlet.ServletException
     * @throws java.io.IOException 
     */
    protected final void process(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        
        response.setStatus(response.SC_FORBIDDEN);
        
        return;
    }
    
    /**
     * Maneja el m�todo <code>GET</code> de HTTP.
     * @param request servlet request
     * @param response servlet response
     * @throws javax.servlet.ServletException
     * @throws java.io.IOException 
     */
    protected final void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        
        process(request, response);
        
    }
    
    /**
     * Maneja el m�todo <code>POST</code> de HTTP.
     * @param request servlet request
     * @param response servlet response
     * @throws javax.servlet.ServletException
     * @throws java.io.IOException 
     */
    protected final void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        
        process(request, response);
        
    }
    
    /**
     * Devuelve una breve descripcion del servlet.
     * @return Breve descripcion del servlet.
     */
    public String getServletInfo() {
        
        return "Servelt de iniciacion Logger y Pool de Conexiones";
        
    }
    // </editor-fold>
    
}
